package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.excel.util.StringUtils;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {

    @Autowired
    private RoleService roleService;

    @Autowired
    private ModuleService moduleService;
    /*
        查询所有角色页面
     */
    @RequestMapping("/list")
    public String findAll(
            @RequestParam(defaultValue = "1")int page,
            @RequestParam(defaultValue = "5")int size
    ){
        //调用roleService层
        PageInfo info=roleService.findAll(page,size,getLoginCompanyId());
        //将数据保存到request域中带到页面展示
        request.setAttribute("page",info);
        return "system/role/role-list";
    }

    /*
        跳转到添加角色页面
     */
    @RequestMapping("/toAdd")
    public String toAdd(){
        return "system/role/role-add";
    }

    /*
        添加角色数据或修改角色数据
     */
    @RequestMapping("/edit")
    public String save(Role role){

        //判断role中是否有id值
        if (StringUtils.isEmpty(role.getId())){
            //封装当前企业数据
            role.setCompanyId(getLoginCompanyId());
            role.setCompanyName(getLoginCompanyName());
            //id为空
            //调用roleService层将获取的到页面数据带到数据库保存
            roleService.save(role);
        }else{
            //id不为空执行修改
            //调用roleService层执行修改
            roleService.update(role);
        }
        //重定向到展示页面
        return "redirect:/system/role/list.do";
    }

    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        //调用roleService层根据ID查询数据
        Role role= roleService.findById(id);
        //将获取到的角色用户保存到request域中
        request.setAttribute("role",role);
        //跳转页面
        return "system/role/role-update";
    }

    /*
        根据ID删除指定的角色数据
     */
    @RequestMapping("delete")
    public String deleteRole(String id){
        //调用roleService层根据ID删除
        roleService.delete(id);
        //重定向到展示页面
        return "redirect:/system/role/list.do";
    }

    //根据Id查询角色所属的权限
    @RequestMapping("/roleModule")
    public String roleModule(String roleid){
        //1.调用roleService层根据roleId查询moduleID
        Role role = roleService.findById(roleid);
        //2.将获取到的role数据保存到request域中
        request.setAttribute("role",role);
        return "system/role/role-module";
    }
    /*
        结束ajax请求，构造出权限数据
        权限数据的结构
         [
           { id:1, pId:0, name:"随意勾选 1"},
           { id:11, pId:1, name:"随意勾选 1-1",checked:true}
         ]
         返回值：List<Map>
         返回值或者方法上需要配置注解ResponseBody
         业务：
            1、查询所有模块数据：List<Module>
            2、循环所有的模块
            3、一个模块开一个对象，构造一个map集合
            4、返回
          为了回显已有的权限数据，工人勾选
          1、查询所有的模块数据：List<Module>
          2、根据勾选的角色ID，查询此角色具有的所有模块的id集合：List<String>
          3、循环所有的模块
          4、一个模块一个对象，构造一个map集合
          5、判断当前循环的模块ID，是否包含在角色的模块ID中
              如果存在：添加一个额外的属性：checked：true
          6、返回
     */

    @ResponseBody
    @RequestMapping("/getZtreeNodes")
    public List<Map> getZtreeNodes(String roleId){
        List<Map> list=new ArrayList<>();
        //根据所有的roleId查询所有的
        List<Module> modules=moduleService.findAll();

        //根据勾选的角色Id。查询此角色具有的所有模块ID的集合
        List<String> roleModuleIds=roleService.findModuleIdsByRoleId(roleId);

        //循环所有模块
        for (Module module : modules) {
            //一个模块一个对象保存到map集合中
            Map map = new HashMap();
            map.put("id",module.getId());
            map.put("pId",module.getParentId());
            map.put("name",module.getName());
            //判断当前角色是否存在此模块
            if (roleModuleIds.contains(module.getId())){
                map.put("checked",true);
            }
            list.add(map);
        }
        //返回
        return list;
    }

    /*
        实现权限分配
        请求连接
        参数：
            roleid：角色
            modules:勾选所有模块id的字符串，中间通过“，”隔开
        业务：调用service即可
        页面跳转
     */
    @RequestMapping("/updateRoleModule")
    public String updateRoleModule(String roleid,String moduleIds){
        //调用roleService层执行保存数据
        roleService.updateRoleModule(roleid,moduleIds);
        //跳转到指定页面
        return "redirect:/system/role/roleModule.do?roleid="+roleid;
    }
}

